﻿using BLLConDes;
using ConDes.Modelos;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace ConDes.Controllers
{
    [Authorize]
    public class AdminController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        #region Categorías

        public ActionResult Categorias()
        {
            CategoriasModel model = new CategoriasModel();
            BLLCategoria bllCategoria = new BLLCategoria();
            model.Categorias = bllCategoria.TraerCategorias();

            return View("Categorias", model);
        }

        public void EliminarCategoria(int idCategoria)
        {
            BLLCategoria bllCategoria = new BLLCategoria();
            bllCategoria.Eliminar(idCategoria);
            bllCategoria.GuardarCambios();
        }

        public ActionResult NuevaCategoria()
        {
            BLLCategoria bllCategoria = new BLLCategoria();
            CategoriaModel model = new CategoriaModel();
            model.Categorias = bllCategoria.TraerCategorias();

            return View("EditarCategoria", model);
        }

        public ActionResult EditarCategoria(int idCategoria)
        {
            BLLCategoria bllCategoria = new BLLCategoria();
            CD_Categoria categoria = bllCategoria.TraerCategoria(idCategoria);
            CategoriaModel model = new CategoriaModel();
            model.Categorias = bllCategoria.TraerCategorias();
            model.IdCategoria = categoria.IdCategoria;
            model.Nombre = categoria.Nombre;

            if (categoria.CD_Categoria1 != null)
                model.IdCategoriaPadre = categoria.IdCategoriaPadre.Value;

            return View("EditarCategoria", model);
        }

        public void Guardar(CategoriaModel model)
        {
            BLLCategoria bllCategoria = new BLLCategoria();
            CD_Categoria categoria;

            if (model.IdCategoria == 0)
                categoria = new CD_Categoria();
            else
                categoria = bllCategoria.TraerCategoria(model.IdCategoria);

            categoria.Nombre = model.Nombre;

            if (model.IdCategoriaPadre == 0)
                categoria.CD_Categoria1 = null;
            else
                categoria.CD_Categoria1 = bllCategoria.TraerCategoria(model.IdCategoriaPadre);

            if (model.IdCategoria == 0)
                bllCategoria.CargarNueva(categoria);
            else
                bllCategoria.EditarCategoria(categoria);

            bllCategoria.GuardarCambios();
        }

        #endregion

        #region Productos

        public ActionResult Productos()
        {
            BLLProducto bllProducto = new BLLProducto();
            ProductosModel model = new ProductosModel();
            model.Productos = bllProducto.TraerProductos();
            return View("Productos", model);
        }

        public void EliminarProducto(int idProducto)
        {
            BLLProducto bllProducto = new BLLProducto();
            bllProducto.Eliminar(idProducto);
            bllProducto.GuardarCambios();
        }

        public ActionResult NuevoProducto()
        {
            BLLCategoria bllCategoria = new BLLCategoria();
            EditarProductoModel model = new EditarProductoModel();
            model.Categorias = bllCategoria.TraerCategorias();

            return View("EditarProducto", model);
        }

        public ActionResult EditarProducto(int idProducto)
        {
            BLLProducto bllProducto = new BLLProducto();
            BLLCategoria bllCategoria = new BLLCategoria(bllProducto.Contexto);
            EditarProductoModel model = new EditarProductoModel();
            CD_Producto producto = bllProducto.TraerProducto(idProducto);

            model.IdProducto = producto.IdProducto;
            model.Categorias = bllCategoria.TraerCategorias();
            model.Descripcion = producto.Descripcion;
            model.IdCategoria = producto.IdCategoria.Value;
            model.Nombre = producto.Nombre;
            model.Precio = producto.Precio.Value;

            return View("EditarProducto", model);
        }

        [ValidateInput(false)]
        public void GuardarProducto(EditarProductoModel model)
        {
            BLLProducto bllProducto = new BLLProducto();
            BLLCategoria bllCategoria = new BLLCategoria(bllProducto.Contexto);
            CD_Producto producto;

            if (model.IdProducto == 0)
                producto = new CD_Producto();
            else
                producto = bllProducto.TraerProducto(model.IdProducto);

            producto.Nombre = model.Nombre;
            producto.CD_Categoria = bllCategoria.TraerCategoria(model.IdCategoria);
            producto.Precio = model.Precio;
            producto.Descripcion = model.Descripcion;

            if (model.IdProducto == 0)
                bllProducto.CargarNuevo(producto);

            bllProducto.GuardarCambios();
        }

        #endregion

        #region Fotos

        public ActionResult VerFotos(int idProducto)
        {
            BLLProductoFoto bllFotos = new BLLProductoFoto();
            FotosModel model = new FotosModel();
            model.IdProducto = idProducto;
            model.Fotos = bllFotos.TraerFotos(idProducto);

            return View("Fotos", model);
        }

        [HttpPost]
        public ActionResult SubirFoto()
        {
            int idProducto = int.Parse(Request["IdProducto"].ToString());
            if (Request.Files.Count > 0)
            {
                var file = Request.Files[0];

                if (file != null && file.ContentLength > 0)
                {
                    string fileName = Path.GetFileName(file.FileName);
                    fileName = ObtenerNombreArchivo(fileName);

                    string carpeta = Server.MapPath("~/Fotos/");
                    file.SaveAs(carpeta + fileName);

                    BLLProductoFoto bllFotos = new BLLProductoFoto();
                    bllFotos.CargarFoto(idProducto, fileName);
                    bllFotos.GuardarCambios();
                }
            }

            return RedirectToAction("VerFotos", new { IdProducto = idProducto });
        }

        private string ObtenerNombreArchivo(string nombreArchivo)
        {
            string carpeta = Server.MapPath("~/Fotos/");
            string formato = (nombreArchivo.EndsWith(".jpg")) ? ".jpg" : ".png";
            string archivo = "fotoProducto";
            string concha = "";
            string pija = "";
            int indice = 0;

            do
            {
                pija = archivo + indice.ToString() + formato;
                concha = carpeta + pija;
                indice++;
            } while (System.IO.File.Exists(concha));
            
            return pija;
        }

        public void EliminarFoto(int idProductoFoto)
        {
            BLLProductoFoto bllFotos = new BLLProductoFoto();
            CD_ProductoFoto foto = bllFotos.Traer(idProductoFoto);

            string carpeta = Server.MapPath("~/Fotos/");
            string archivo = carpeta + foto.Archivo;

            if (System.IO.File.Exists(archivo))
                System.IO.File.Delete(archivo);

            bllFotos.Eliminar(idProductoFoto);
            bllFotos.GuardarCambios();
        }

        #endregion
    }
}
